home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PAS_0493 / EXECUTE.PAS < prev    next >
Pascal/Delphi Source File  |  1993-04-22  |  5KB  |  157 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 285 of 354
  3. From : Mark Lewis                          1:3634/12.0          14 Apr 93  17:12
  4. To   : Kelly Small
  5. Subj : Redirection of output...
  6. ────────────────────────────────────────────────────────────────────────────────
  7.  >  BC> Still need a bit of help here.  I can't redirect output from a
  8.  >  BC> program when executing it from a Pascal program!  Is there any
  9.  >  BC> this from Pascal? Any help would be greatly appreciated.
  10.  > If I understand you, you are using the Exec procedure to run a
  11.  > program.  IF that is the case you won't be ablr to redirect since
  12.  > this is a function of Dos and not the program you exec.  You will
  13.  > need to run the program through a child process in order to
  14.  > perform the redirect, something like:
  15.  > Exec(GetEnv('COMSPEC'),'/C MyProg.exe>redirect');
  16.  
  17. one could also utilize duplicate file handles -=B-)
  18.  
  19. ie: this source posted in here a year or so ago<<smile>>...}
  20.  
  21. {=============================================================}
  22. Unit Execute;
  23.  
  24. Interface
  25.  
  26. Procedure Exec(Path,CmdLine : String);
  27.  
  28. Implementation
  29.  
  30. Uses Dos;
  31.  
  32. Function ExtractFileName(Var Line : String;Index : Integer) : String;
  33.  
  34. Var
  35.   Temp : String;
  36.  
  37. Begin
  38.   Delete(Line,Index,1);
  39.   While (Index <= Length(Line)) AND (Line[Index] = ' ')
  40.     Do Delete(Line,Index,1);
  41.   Temp := '';
  42.   While (Index <= Length(Line)) AND (Line[Index] <> ' ') Do
  43.   Begin
  44.     Temp := Temp + Line[Index];
  45.     Delete(Line,Index,1);
  46.   End;
  47.   ExtractFileName := Temp;
  48. End;
  49.  
  50. Procedure CloseHandle(Handle : Word);
  51.  
  52. Var
  53.   Regs : Registers;
  54.  
  55. Begin
  56.   With Regs Do
  57.   Begin
  58.     AH := $3E;
  59.     BX := Handle;
  60.     MsDos(Regs);
  61.   End;
  62. End;
  63.  
  64. Procedure Duplicate(SourceHandle : Word;Var TargetHandle : Word);
  65.  
  66. Var
  67.   Regs : Registers;
  68.  
  69. Begin
  70.   With Regs Do
  71.   Begin
  72.     AH := $45;
  73.     BX := SourceHandle;
  74.     MsDos(Regs);
  75.     TargetHandle := AX;
  76.   End;
  77. End;
  78.  
  79. Procedure ForceDuplicate(SourceHandle : Word;Var TargetHandle : Word);
  80.  
  81. Var
  82.   Regs : Registers;
  83.  
  84. Begin
  85.   With Regs Do
  86.   Begin
  87.     AH := $46;
  88.     BX := SourceHandle;
  89.     CX := TargetHandle;
  90.     MsDos(Regs);
  91.     TargetHandle := AX;
  92.   End;
  93. End;
  94.  
  95. Procedure Exec(Path,CmdLine : String);
  96.  
  97. Var
  98.   StdIn   : Word;
  99.   Stdout  : Word;
  100.   Index   : Integer;
  101.   FName   : String[80];
  102.   InFile  : Text;
  103.   OutFile : Text;
  104.  
  105.   InHandle  : Word;
  106.   OutHandle : Word;
  107.          { ===============>>>> }   { change below for STDERR }
  108. Begin
  109.   StdIn := 0;
  110.   StdOut := 1;                    { change to 2 for StdErr       }
  111.   Duplicate(StdIn,InHandle);      { duplicate standard input     }
  112.   Duplicate(StdOut,OutHandle);    { duplicate standard output    }
  113.   Index := Pos('>',CmdLine);
  114.   If Index > 0 Then               { check for output redirection }
  115.   Begin
  116.     FName := ExtractFileName(CmdLine,Index);  { get output file name  }
  117.     Assign(OutFile,FName);                    { open a text file      }
  118.     Rewrite(OutFile);                         { .. for output         }
  119.     ForceDuplicate(TextRec(OutFile).Handle,StdOut);{ make output same }
  120.   End;
  121.   Index := Pos('<',CmdLine);
  122.   If Index > 0 Then               { check for input redirection }
  123.   Begin
  124.     FName := ExtractFileName(CmdLine,Index);  { get input file name  }
  125.     Assign(InFile,FName);                     { open a text file     }
  126.     Reset(InFile);                            { for input            }
  127.     ForceDuplicate(TextRec(InFile).Handle,StdIn);  { make input same }
  128.   End;
  129.   DOS.Exec(Path,CmdLine);           { run EXEC }
  130.   ForceDuplicate(InHandle,StdIn);   { put standard input back to keyboard }
  131.   ForceDuplicate(OutHandle,StdOut); { put standard output back to screen  }
  132.   CloseHandle(InHandle);            { close the redirected input file     }
  133.   CloseHandle(OutHandle);           { close the redirected output file    }
  134. End;
  135.  
  136. End.
  137.  
  138. {===============================================================}
  139. {
  140. Use it exactly as you would the normal EXEC procedure:
  141.  
  142.   Exec('MASM.EXE','mystuff.asm');
  143.  
  144. To activate redirection simply add the redirection symbols, etc:
  145.  
  146.   Exec('MASM.EXE','mystuff.asm >err.lst');
  147.  
  148.  
  149. One note of caution.  This routine temporarily uses extra handles. It's
  150. either two or four more.  The various books I have are not clear as to
  151. whether duplicated handles 'count' or not. My guess is yes.  If you don't
  152. plan on redirecting STDIN then remove all the code for duplicating it to
  153. cut your handle overhead in half.
  154. }
  155.  
  156. i wish i could remember who posted it originally but i can't. if they happen to
  157. be reading this, THANKS!